/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Usuarios;

import Controladores.UsuarioJpaController;
import Controladores.exceptions.NonexistentEntityException;
import Entidades.Tipousuario;
import Entidades.Usuario;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

/** @Author: JEscalanteGT <jescalantegt@gmail.com> 
  *  Date: 3:00 pm 23/06/2013
  *  Branch: EquipoD
  **/ 
public class ManejoUsuarios {
    public String error = "";
    public void guardarRegistro(String username, String contraseña, String nombre, String apellidos, String email, Tipousuario tipoUsuario) throws Exception{
        if(registroExistente(username.toLowerCase()) == false){
            EntityManagerFactory emf = conexion.getInstancia().getEMF();
            UsuarioJpaController usuarioController = new UsuarioJpaController(emf);

            Usuario usuario = new Usuario();
            usuario.setUsername(username);
            usuario.setContraseña(contraseña);
            usuario.setNombre(nombre);
            usuario.setApellidos(apellidos);
            usuario.setEmail(email);
            usuario.setTipoUsuarioidTipoUsuario(tipoUsuario);
            usuarioController.create(usuario);
            System.out.println("Se ha ingresado el registro exitosamente");
        }
        else{
            error = "Error, registro con el mismo nombre.";
            System.out.println("Error, registro con el mismo nombre.");
        }
    }
    
    public void guardarRegistro2(String username, String contraseña, String nombre, String apellidos, String email, int idTipoUsuario) throws Exception{
        if(registroExistente(username.toLowerCase()) == false){
            EntityManagerFactory emf = conexion.getInstancia().getEMF();
            UsuarioJpaController usuarioController = new UsuarioJpaController(emf);

            Usuario usuario = new Usuario();
            usuario.setUsername(username);
            usuario.setContraseña(contraseña);
            usuario.setNombre(nombre);
            usuario.setApellidos(apellidos);
            usuario.setEmail(email);
            ManejoTiposUsuario manejo = new ManejoTiposUsuario();
            Tipousuario tipoUsuario = manejo.obtenerRegistroID(idTipoUsuario);
            usuario.setTipoUsuarioidTipoUsuario(tipoUsuario);
            usuarioController.create(usuario);
            System.out.println("Se ha ingresado el registro exitosamente");
        }
        else{
            error = "Error, registro con el mismo nombre.";
            System.out.println("Error, registro con el mismo nombre.");
        }
    }
    
    public void modificarRegistro(int idUsuario, String nombre, String apellidos, String email){
        Usuario registro = new Usuario();
        if(registroExistenteByID(idUsuario) == true){
            try {
                EntityManagerFactory emf = conexion.getInstancia().getEMF();
                UsuarioJpaController usuarioController = new UsuarioJpaController(emf);
                registro = usuarioController.findUsuario(idUsuario);
                registro.setNombre(nombre);
                registro.setApellidos(apellidos);
                registro.setEmail(email);
                usuarioController.edit(registro);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(ManejoUsuarios.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(ManejoUsuarios.class.getName()).log(Level.SEVERE, null, ex);
            }
        }else{
            error = "Usuario no existente.";
        }
    }
    public void actualizarContraseña(int idUsuario, String contraseñaActual, String contraseña) throws Exception{
        Usuario registro = new Usuario();
        if(registroExistenteByID(idUsuario) == true){
            EntityManagerFactory emf = conexion.getInstancia().getEMF();
            UsuarioJpaController usuarioController = new UsuarioJpaController(emf);
            registro = usuarioController.findUsuario(idUsuario);
            if(registro.comprobarContraseña(contraseñaActual) == false){
                registro = new Usuario();
                error = "Error, las contraseñas no coinciden.";
            }else{
                registro.setContraseña(contraseña);
                usuarioController.edit(registro);
            }
        }
        else{
            error = "Error, registro no existente.";
        }
    }
    public Usuario login(String username, String contraseña) throws Exception{
        Usuario registro = new Usuario();
        if(registroExistente(username.toLowerCase()) == true){
            registro = obtenerRegistroUsername(username);
            if(registro.comprobarContraseña(contraseña) == false){
                registro = new Usuario();
                error = "Error, las contraseñas no coinciden.";
            }           
        }
        else{
            error = "Error, registro no existente.";
        }
        return registro;
    }
    public Usuario obtenerRegistroUsername(String username){
        Usuario registro = new Usuario();        
        Boolean existeRegistro = false;
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        
        Query qr;
        qr = em.createNamedQuery("Usuario.findByUsername");
        qr.setParameter("username", username);
        List<Usuario> listadoUsuarios = qr.getResultList();
        registro = listadoUsuarios.get(0);
        return registro;
    }

    public Boolean registroExistente(String username){
        Boolean existeRegistro = false;
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        
        Query qr;
        qr = em.createNamedQuery("Usuario.findByUsername");
        qr.setParameter("username", username);
        List<Usuario> listadoUsuarios = qr.getResultList();
        if(listadoUsuarios.size()>0)
            existeRegistro = true;
        return existeRegistro;
    }
    public Boolean registroExistenteByID(int idUsuario){
        Boolean existeRegistro = false;
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        
        Query qr;
        qr = em.createNamedQuery("Usuario.findByIdUsuario");
        qr.setParameter("idUsuario", idUsuario);
        List<Usuario> listadoUsuarios = qr.getResultList();
        if(listadoUsuarios.size()>0)
            existeRegistro = true;
        return existeRegistro;
    }
    public List<Usuario> obtenerUsuarios(){
        List<Usuario> listado = new ArrayList();
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        
        Query qr;
        qr = em.createNamedQuery("Usuario.findAll");
        listado = qr.getResultList();
        return listado; 
    }
}
